Code sample Home

Object goes along a polyline, by using function lcWndRedrawAuto
The sample code needs the drawing "UAV demo.lcd"
Download Demo video to see how the sample code works.


void CALLBACK ProcRedraw (HANDLE hLcWnd, int Elapsed);

//-----------------------------------------------
void DemoRedraw (HANDLE hLcWnd)
{
  static int Mode = 1;  // 0-stop redraw, 1-start redraw
  static bool bSetCenter = true;
  HANDLE hBlock, hEnt, hPline;
  double Len, Step;

  if (Mode == 0){
    // stop auto-redraw
    lcWndRedrawAuto( hLcWnd, 0, 0 );
    Mode = 1;
  }else{
    hBlock = lcPropGetHandle( hLcWnd, LC_PROP_WND_VIEWBLOCK );
    hEnt = lcBlockGetEntByKey( hBlock, 151 );
    if (hEnt){
      if (lcEntType( hEnt, LC_ENT_BLOCKREF ) == TRUE){
        hPline = lcBlockGetEntByKey( hBlock, 152 );   // this polyline is used as a track for entity hEnt
        if (lcEntType( hPline, LC_ENT_POLYLINE ) == TRUE){
          lcPropPutHandle( hLcWnd, LC_PROP_WND_HANDLE0, hEnt );
          lcPropPutHandle( hLcWnd, LC_PROP_WND_HANDLE1, hPline );
          Len = lcPropGetFloat( hPline, LC_PROP_PLINE_LEN );   // polyline (track) length
          lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT0, Len );
          lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT1, 0.0 );   // start distance
          Step = Len / 300.0;
          lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT2, Step );  // distance increment
          lcPropPutInt( hLcWnd, LC_PROP_WND_INT0, 0 );         // 0-forward, 1-backward movement
          lcPropPutInt( hLcWnd, LC_PROP_WND_INT1, bSetCenter );
          // start redraw by timer   
          lcWndRedrawAuto( hLcWnd, 33, ProcRedraw );
          bSetCenter = !bSetCenter;
          Mode = 0;
          return;
        }
      }
    }
    lcWndMessage( hLcWnd, L"UAV and track are not found\nLoad the drawing \"UAV demo.lcd\"", LC_MB_OK | LC_MB_ICONSTOP );
  }
}

//-----------------------------------------------
void CALLBACK ProcRedraw (HANDLE hLcWnd, int Elapsed)
{
  HANDLE hDrw, hBlock, hUAV, hPline;
  double X, Y, Ang, Len, Pos, Step;
  int Backward, SetCenter;

  hBlock = lcPropGetHandle( hLcWnd, LC_PROP_WND_VIEWBLOCK );
  hUAV   = lcPropGetHandle( hLcWnd, LC_PROP_WND_HANDLE0 );
  hPline = lcPropGetHandle( hLcWnd, LC_PROP_WND_HANDLE1 );
  Len  = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT0 );    // track length
  Pos  = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT1 );    // distance of current position
  Step = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT2 );    // distance increment
  Backward  = lcPropGetInt( hLcWnd, LC_PROP_WND_INT0 );   // backward movement
  SetCenter = lcPropGetInt( hLcWnd, LC_PROP_WND_INT1 );   // "Set view center" mode
  lcPlineGetPoint( hPline, Pos, &X, &Y, &Ang );
  lcPropPutFloat( hUAV, LC_PROP_BLKREF_X, X );
  lcPropPutFloat( hUAV, LC_PROP_BLKREF_Y, Y );
  if (Backward){
    Ang = Ang + LC_DEG180;
  }
  lcPropPutFloat( hUAV, LC_PROP_BLKREF_ANGLE, Ang );
  lcEntUpdate( hUAV );

  // set parameters for next redraw
  if (Backward){
    Pos -= Step;
    if (Pos < 0.0){
      Pos = 0.0;
      Backward = 0;
    }
  }else{
    Pos += Step;
    if (Pos > Len){
      Pos = Len;
      Backward = 1;
    }
  }
  lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT1, Pos );  // next position
  lcPropPutInt( hLcWnd, LC_PROP_WND_INT0, Backward ); 

  if (SetCenter){
    // set view center
    lcPropPutFloat( hLcWnd, LC_PROP_WND_XCEN, X );
    lcPropPutFloat( hLcWnd, LC_PROP_WND_YCEN, Y );
  }

  // disable message "Drawing was changed, save it?" when the drawing will be closed
  hDrw = lcPropGetHandle( hLcWnd, LC_PROP_WND_DRW );
  lcPropPutBool( hDrw, LC_PROP_DRW_DIRTY, false );
}